const express = require('express');
const cors = require('cors');  // 跨域
const app = express();

const bodyParser = require('body-parser');
const jwtconfig = require('./jwt_config/index');
// 使用了对象解构的方式从 express-jwt 模块中获取 expressjwt 并将其重命名为 jwt
const {expressjwt:jwt} = require('express-jwt');

const multer = require("multer"); // multer上传头像

app.use(cors()) // 挂载,跨域

// 创建了一个上传配置对象 upload , { dest: './public/upload' } 表示上传的文件将被存储在 ./public/upload 目录中
const upload = multer({dest:'./public/upload'}) 
// 将 multer 的配置应用到 Express 应用中，any() 方法表示允许接受任何类型的文件上传
app.use(upload.any())
// 告诉 Express 服务器将 ./public 目录设置为静态文件目录
// 这意味着当客户端请求 /public 目录下的静态文件（如 CSS、JavaScript、图片等）时，服务器可以直接提供这些文件而无需通过路由处理函数
app.use(express.static("./public"))

// extended值为false则值只能为数组或者字符串，true则可以是任意类型
app.use(bodyParser.urlencoded({ extended:false }))
app.use(bodyParser.json())

// 返回错误的中间件，一定要在登录路由前面  cc自定义函数
app.use((req,res,next)=>{
    // status=0成功，=1失败，默认失败方面处理失败情况
    res.cc = (err,status=1)=>{
        res.send({
            status,
            // 判断err是错误对象还是字符串
            message: err instanceof Error ? err.message : err,
        })
    }
    next()
})

// app.use(jwt({
//     secret: jwtconfig.jwtSecretKey,   // 用于验证 JWT（JSON Web Token）的密钥
//     algorithms: ['HS256']  // 用于签署和验证 JWT 的算法，这里使用的是 HS256 算法
// }).unless({  // 排除不需要token的接口
//     path: [/^\/api\//] // 排除登录和注册，因为token是注册登录后才有的
// }))

const loginRouter = require('./router/login');
const Joi = require('joi');
// app.use()位置不变，jwt和listen下面
// ``api``加入前缀，如果我们要访问本地路径要加入这个前缀才能访问到（挂载路由）
app.use('/api', loginRouter);  

const userRouter = require('./router/userInfo');
app.use('/user', userRouter); 

const setRouter = require('./router/setting.js');
app.use('/set', setRouter);

const productRouter = require('./router/product.js');
app.use('/pro', productRouter);

const messageRouter = require('./router/message.js');
app.use('/msg', messageRouter);

const fileRouter = require('./router/file.js');
app.use('/file', fileRouter);

const loginLogRouter = require('./router/login_log.js');
app.use('/llog', loginLogRouter)

const operationLogRouter = require('./router/operation_log.js');
app.use('/olog', operationLogRouter)

// 系统概览
const overviewLogRouter = require('./router/overview.js');
app.use('/ov', overviewLogRouter)

// 部门设置
const depMsgRouter = require('./router/department_msg.js');
app.use('/dm', depMsgRouter)

// joi错误中间件,不符合JOI规则的
app.use((err,req,res,next)=>{
    if(err instanceof Joi.ValidationError) return res.cc(err)
})


app.listen(3007, () => {  // 让创建的服务器应用 `app` 监听端口 `3007`,当服务器成功启动并开始监听指定端口时，会执行回调函数
    console.log('http://127.0.0.1:3007');
})